home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
fb386
/
vlist
/
vlist.bas
next >
Wrap
BASIC Source File
|
1991-10-18
|
5KB
|
137 lines
100 ' --- 変数表作成ユーティリティ vlist.bas Ver. 1.0 '91.04.28 ---
110 ' copyright(c)1991 handle name : 黒崎 黒作 , NIFTY ID : NAG01365
120 '
130 ' バイナリ形式でセーブしたF-BASIC386のプログラムを読み込み、変数と
140 ' その変数の使用行番号の一覧表を作成します。詳細は VLIST.DOCを参照
150 ' してください。
160 '
170 SCREEN@ 0 : WIDTH 80,25 : PALETTE : COLOR 7,0 : CLS
180 DEFINT A-Z : VLMT=500 : LLMT=30000 '変数&行番号格納領域の上限
190 DIM VM$(5),CMD(&H1F),V$(VLMT),P(VLMT),L(LLMT)
200 FOR I=0 TO 5 : READ VM$(I) : NEXT '変数の種別用
210 DATA "","%","&","!","#","$"
220 FOR I=0 TO &H1F : READ CMD(I) : NEXT '中間コード00~1Fの処理番号
230 DATA 6,1,1,6,6,2,2,3,0,4,4,4,4,4,4,6
240 DATA 6,2,2,7,8,10,10,14,2,0,0,10,0,5,0,7
250 M1$="変数登録領域が足りません"
260 M2$="行番号登録領域が足りません"
270 M3$="要素だけ増やしてください"
280 M4$="未定義の中間コードがあります"
290 ON ERROR GOTO *エラー
300 '
310 *FILE名入力
320 LINE INPUT "file name [.BASは不要][.で終了] ";F1$
330 IF F1$="." THEN END
340 F$=F1$+".BAS" : ER=1 : OPEN"I",#1,F$ : CLOSE #1 '存在するかの検査
350 OPEN"R",#1,"(1)"+F$ : N&=LOF(1) : CLOSE #1 'ファイルサイズ
360 DIM D(N& \ 2) : LOAD@ F$,D : A&=VARPTR(D(0)) '配列に取り込み
370 VMAX=0 : LMAX=1 : C1=0 : C2=0 : C3=0
380 '
390 GOSUB *L_GET : A&=A&+8
400 IF D&<>-1 THEN PRINT"バイナリ形式じゃない":ERASE D:GOTO *FILE名入力
410 PRINT"結果をファイルに出力しますか?[Y/N]"
420 Y=INSTR("YyNn",INPUT$(1)) : IF Y=0 THEN 410
430 F1=(Y<=2)
440 '
450 *MAIN
460 GOSUB *W_GET : NX&=D& : NX1&=A&+NX&-2 '次行のアドレス
470 IF NX&=0 THEN ERASE D : GOSUB *変数表示 : GOTO *FILE名入力
480 GOSUB *W_GET : IF D&>32767 THEN D&=D&-65536 '符号付整数にして保存
490 LNUM=D& : PRINT "行番号 ";D&
500 IF NX&>256 THEN PRINT "ポインタ異常" : END
510 *MAIN2
520 IF A&<NX1& THEN GOSUB *解析 : GOTO *MAIN2
530 GOTO *MAIN
540 '
550 *変数表示
560 IF F1 THEN ER=2 : OPEN"O",#1,F1$+".VAR"
570 M$="FILE NAME : "+F1$+".BAS" : GOSUB *ファイル出力
580 IF C1>0 THEN M$=M1$+STR$(C1*2)+M3$ : GOSUB *ファイル出力
590 IF C2>0 THEN M$=M2$+STR$(C2*2)+M3$ : GOSUB *ファイル出力
600 IF C3>0 THEN M$=M4$+STR$(C3) : GOSUB *ファイル出力
610 IF VMAX=0 THEN *表示3 '変数未使用時
620 IF VMAX>1 THEN GOSUB *ソート
630 FOR I=0 TO VMAX-1
640 M$="<<< "+V$(I)+" >>>" : LK=P(I) : GOSUB *ファイル出力
650 *表示2
660 LNUM&=L(LK-1) : IF LNUM&<0 THEN LNUM&=LNUM&+65536
670 L$=STR$(LNUM&) : PRINT L$; : IF F1 THEN PRINT #1,L$;
680 IF L(LK)>0 THEN LK=L(LK) : GOTO *表示2
690 PRINT : IF F1 THEN PRINT #1
700 NEXT
710 *表示3
720 IF F1 THEN CLOSE #1
730 RETURN
740 '
750 *ファイル出力
760 PRINT M$ : IF F1 THEN PRINT #1,M$
770 RETURN
780 '
790 *ソート
800 PRINT "ソート中 ";
810 FOR I=0 TO VMAX-2
820 V$=V$(I) : K=I :PRINT "+";
830 FOR J=I+1 TO VMAX-1
840 IF V$>V$(J) THEN V$=V$(J) : K=J
850 NEXT
860 IF K<>I THEN SWAP V$(I),V$(K) : SWAP P(I),P(K)
870 NEXT
880 PRINT : RETURN
890 '
900 *解析
910 C=PEEK(A&) : A&=A&+1
920 IF C>=&HFE THEN A&=A&+1 : RETURN
930 IF C>=&H20 THEN RETURN
940 CMD=CMD(C) : IF CMD=0 THEN PRINT " 未定義" : C3=C3+1 : RETURN
950 IF CMD>5 THEN A&=A&+CMD-6 : RETURN
960 ON CMD GOSUB *S_REM,*S_SKIP,*S_ARRY,*S_VAR,*S_LAB
970 RETURN
980 '
990 *S_REM '注釈
1000 A&=NX1&-1 : RETURN
1010 *S_ARRY '配列変数
1020 VF=1 : GOSUB *B_GET : C=D& : GOTO *S_VAR2
1030 *S_VAR '変数
1040 VF=0
1050 *S_VAR2
1060 GOSUB *S_GET : V$=V$+VM$(C-9) : IF VF=1 THEN V$=V$+"()"
1070 GOSUB *変数登録 : RETURN
1080 *S_LAB 'ラベル
1090 A&=A&+4 : GOSUB *S_SKIP : RETURN
1100 '
1110 *B_GET '1バイト読出
1120 D&=PEEK(A&) : A&=A&+1 : RETURN
1130 *W_GET '1ワード読出
1140 D&=PEEK(A&,2) : A&=A&+2 : RETURN
1150 *L_GET '1ロングワード読出
1160 D&=PEEK(A&,4) : A&=A&+4 : RETURN
1170 *S_GET '文字列読出
1180 GOSUB *B_GET : IF D&=0 THEN RETURN
1190 N=D& : V$=""
1200 FOR I=1 TO N
1210 D&=PEEK(A&) : A&=A&+1 : IF D&>0 THEN V$=V$+CHR$(D&)
1220 NEXT : RETURN
1230 *S_SKIP '文字列読み飛ばし
1240 GOSUB *B_GET : A&=A&+D& : RETURN
1250 '
1260 *変数登録
1270 PRINT V$
1280 IF VMAX>VLMT THEN PRINT M1$ : C1=C1+1 :RETURN
1290 IF LMAX+1>LLMT THEN PRINT M2$ : C2=C2+1 : RETURN
1300 IF VMAX=0 THEN *登録2
1310 FOR J=0 TO VMAX-1 'VMAX,LMAXは次の登録位置を指す
1320 IF V$=V$(J) THEN LK=P(J) : GOTO *登録3
1330 NEXT
1340 *登録2
1350 V$(VMAX)=V$ : P(VMAX)=LMAX : VMAX=VMAX+1 '変数とLへのポインタの格納
1360 L(LMAX)=0 : L(LMAX-1)=LNUM : LMAX=LMAX+2 : RETURN '終端と行番号
1370 '
1380 *登録3
1390 IF L(LK)>0 THEN LK=L(LK) : GOTO *登録3
1400 L(LK)=LMAX : L(LMAX)=0 : L(LMAX-1)=LNUM : LMAX=LMAX+2 : RETURN
1410 '
1420 *エラー
1430 IF ER=1 THEN PRINT "そのファイルはありません" : RESUME *FILE名入力
1440 IF ER=2 THEN PRINT F1$+".VAR に上書きします":KILL F1$+".VAR":RESUME
1450 PRINT ERL;"行 エラー番号";ERR